perm filename PUPSAI.SAI[S,HE] blob sn#721897 filedate 1983-08-01 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	ENTRY NameLookup
C00008 ENDMK
C⊗;
ENTRY NameLookup;
BEGIN "PUPSUB"

REQUIRE "PUPDEF[HDR,HE]" SOURCE_FILE;

COMMENT Subroutines for using PUP.
	Allan Miller 4/83;

PROCEDURE SNOOZE(INTEGER TIME(0));
Comment sleeps for 1/60 of a second (until next tick, I guess);
Comment unless argument is nonzero, then it sleeps that many seconds;

BEGIN "SNOOZE"
   QUICK_CODE "SLEEP"
      MOVE '13,TIME;
      CALLI '13,'31
   END "SLEEP";
END "SNOOZE";  Comment what a kludge;

INTERNAL PROCEDURE NAMELOOKUP(STRING NAME; INTEGER ARRAY HOSTSOCKET;
			REFERENCE BOOLEAN FOUND; REFERENCE STRING ERRMESS);
COMMENT Call the name server to look up the name NAME.  If found, return
	FOUND=TRUE and return the first host/socket found in HOSTSOCKET[0..5].
	If not found, return FOUND=FALSE and the returned error message in
	ERRMESS. ;
BEGIN "NAMELOOKUP"
    EXTERNAL INTEGER _SKIP_;
    INTEGER ARRAY PUP[0:MAXPUPWORDS];
    INTEGER ARRAY MTP[0:6];
    INTEGER OPCODE,COUNT,BRCHAR,EOF,LEN,PUPCHN,I,PTR,NCHAR;
    BOOLEAN GOTIT;

    PUPCHN ← GETCHAN;
    EOF ← 1;
    OPEN(PUPCHN,"PUP",'15,0,0,COUNT,BRCHAR,EOF);
    IF EOF NEQ 0 THEN
	BEGIN
	    FOUND ← FALSE;
	    ERRMESS ← "OPEN failed on PUP";
	END
    ELSE BEGIN
    COMMENT Set up an MTAPE to open a connection with the misc. services;
    MTP[0] ← PUPLISTEN; COMMENT Function;
    MTP[2] ← -1; COMMENT Local socket number (generate one);
    MTP[3] ← 0; COMMENT Wait flag;
    MTP[4] ← 8; COMMENT Byte size;
    MTP[5] ← MISCSERV; COMMENT Remote socket number (misc. services);
    MTP[6] ← -1; COMMENT Remote host (broadcast);
    COMMENT Set up MTAPE uuo...;
    OPCODE ← '072000000000 + (PUPCHN LSH 23);
    CODE(OPCODE,MTP[0]);
    IF MTP[1] NEQ 0 THEN
	BEGIN
	    FOUND ← FALSE;
	    ERRMESS ← "Failed to connect to name server";
	END
    ELSE BEGIN
    COMMENT Set up the PUP to send the name request;
    NCHAR ← LENGTH(NAME);
    DPB(NCHAR+PUPOVERHEAD,POINT(16,PUP[0],15)); COMMENT Length in bytes;
    DPB(NAMEREQUEST,POINT(16,PUP[0],31)); COMMENT PUP type;
    FOR I ← 1 STEP 1 UNTIL 4 DO PUP[I] ← 0; COMMENT Let WAITS fill in the rest;
    PTR ← POINT(8,PUP[5],-1);
    FOR I ← 1 STEP 1 UNTIL NCHAR DO IDPB(LOP(NAME),PTR);
    ARRYOUT(PUPCHN,PUP[0],(NCHAR+PUPOVERHEAD+3) DIV 4);
    IF EOF NEQ 0 THEN
	BEGIN
	    FOUND ← FALSE;
	    ERRMESS ← "Output to PUP failed";
	END
    ELSE BEGIN
    COMMENT Get reply from misc. server;
    MTP[0] ← SKIPREADY;
    CODE(OPCODE,MTP[0]);
    IF _SKIP_ = 0 THEN
	BEGIN
	    SNOOZE(0);
	    CODE(OPCODE,MTP[0]);
	    IF _SKIP_ = 0 THEN
		BEGIN
		    SNOOZE(1);
		    CODE(OPCODE,MTP[0]);
		    IF _SKIP_ = 0 THEN
			GOTIT ← FALSE
		    ELSE
			GOTIT ← TRUE
		END
	    ELSE
		GOTIT ← TRUE
	END
    ELSE
	GOTIT ← TRUE;
    IF NOT GOTIT THEN
	BEGIN
	    FOUND ← FALSE;
	    ERRMESS ← "No reply from name server";
	END
    ELSE BEGIN
    COMMENT Receive the PUP;
    ARRYIN(PUPCHN,PUP[0],MAXPUPWORDS);
    COMMENT Extract PUP type, check if successful;
    IF LDB(POINT(8,PUP[0],31)) = NAMEREPLY THEN
	BEGIN
	    FOUND ← TRUE;
	    PTR ← POINT(8,PUP[5],-1);
	    FOR I ← 0 STEP 1 UNTIL 5 DO HOSTSOCKET[I] ← ILDB(PTR);
	END
    ELSE
	BEGIN
	    FOUND ← FALSE;
	    LEN ← LDB(POINT(16,PUP[0],15))-PUPOVERHEAD;
	    PTR ← POINT(8,PUP[5],-1);
	    ERRMESS ← NULL;
	    FOR I ← 1 STEP 1 UNTIL LEN DO ERRMESS ← ERRMESS & ILDB(PTR);
	END;
    END END END END;
    RELEASE(PUPCHN);
END "NAMELOOKUP";

END "PUPSUB"